home *** CD-ROM | disk | FTP | other *** search
/ Delphi Informant Complete 1995 - 2000 / Delphi Informant Complete 1995 to 2000.iso / Delphi Informant Magazine Complete Works SOURCE CODE 1995.rar / 1995 / DEC / DI9512SS / region1.pas < prev   
Pascal/Delphi Source File  |  1995-10-15  |  6KB  |  213 lines

  1. unit Region1;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  7.   Forms, Dialogs, ExtCtrls, StdCtrls;
  8.  
  9. type
  10.   Prec = ^arec;
  11.   arec = record
  12.     rgn: HRgn;
  13.     id:  String;
  14.   end;
  15.   TForm1 = class(TForm)
  16.     ScrollBox1: TScrollBox;
  17.     Image1: TImage;
  18.     ButtonEllipse: TButton;
  19.     Bevel1: TBevel;
  20.     Label1: TLabel;
  21.     ButtonPolygon: TButton;
  22.     ButtonRectangle: TButton;
  23.     Label2: TLabel;
  24.     Bevel2: TBevel;
  25.     RadioButtonShow: TRadioButton;
  26.     RadioButtonHide: TRadioButton;
  27.     procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
  28.       Shift: TShiftState; X, Y: Integer);
  29.     procedure FormCreate(Sender: TObject);
  30.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  31.     procedure FreeRegions;
  32.     procedure ButtonPolygonClick(Sender: TObject);
  33.     procedure ButtonEllipseClick(Sender: TObject);
  34.     procedure ButtonRectangleClick(Sender: TObject);
  35.     procedure ShowOrHide(Sender: TObject);
  36.   private
  37.     { Private declarations }
  38.   public
  39.     { Public declarations }
  40.   end;
  41.  
  42. var
  43.   Form1:         TForm1;
  44.   RedBrush:      HBrush;
  45.   ImageHandle:   HDC;
  46.   Bitmap:        Tbitmap;
  47.   Nregions:      Integer;
  48.   RegionList:    Tlist;
  49.   RegionRecord:  Prec;
  50.   i:             Integer;
  51.  
  52. implementation
  53.  
  54. {$R *.DFM}
  55.  
  56. procedure TForm1.FormCreate(Sender: TObject);
  57. begin
  58.   RedBrush    := CreateSolidBrush(clRed);
  59.   Nregions    := 0;
  60.   RegionList  := Tlist.Create;
  61. end;
  62.  
  63. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  64. begin
  65.   FreeRegions;
  66.   DeleteObject(RedBrush);
  67.   RegionList.Free;
  68. end;
  69.  
  70. procedure TForm1.FreeRegions;
  71. var
  72.   i:      Integer;
  73. begin
  74.   for i := 0 to RegionList.Count - 1 do
  75.   begin
  76.     RegionRecord := RegionList.Items[i];
  77.     DeleteObject(RegionRecord^.Rgn);
  78.   end;
  79.   RegionList.Clear;
  80. end;
  81.  
  82. { The next three procedures create regions in resonse to the
  83.   buttons on the form.  }
  84.  
  85. procedure TForm1.ButtonEllipseClick(Sender: TObject);
  86. var
  87.   x1,x2,y1,y2:        Integer;
  88. begin
  89.   FreeRegions;
  90.   ImageHandle := Image1.Canvas.Handle;
  91.   Nregions := 5;
  92.   for i := 1 To Nregions do
  93.   begin
  94.     x1 := i*40;
  95.     x2 := x1 + 35;
  96.     y1 := i*30;
  97.     y2 := x1 + 25;
  98.     New(RegionRecord);
  99.     RegionRecord^.rgn := CreateEllipticRgn(x1,y1, x2,y2);
  100.     RegionRecord^.id  := ' Hello from elliptic region ' + IntToStr(i);
  101.     RegionList.Add(RegionRecord);
  102.   end;
  103.   ShowOrHide(Sender);
  104.   Label1.Caption := 'Elliptic regions created.'
  105. end;
  106.  
  107. procedure TForm1.ButtonPolygonClick(Sender: TObject);
  108. var
  109.   PointArray:          Array[1..10] of Tpoint;
  110.   npoints:             Integer;
  111. begin
  112.   FreeRegions;
  113.   ImageHandle := Image1.Canvas.Handle;
  114.   Nregions := 3;
  115.   PointArray[1] := Point(5, 5);
  116.   PointArray[2] := Point(100, 5);
  117.   PointArray[3] := Point(110, 70);
  118.   New(RegionRecord);
  119.   RegionRecord^.rgn := CreatePolygonRgn(PointArray, 3, WINDING);
  120.   RegionRecord^.id  := ' Hello from polygon region 1';
  121.   RegionList.Add(RegionRecord);
  122.   PointArray[1] := Point(15, 80);
  123.   PointArray[2] := Point(120, 100);
  124.   PointArray[3] := Point(20, 120);
  125.   PointArray[4] := Point(15, 160);
  126.   New(RegionRecord);
  127.   RegionRecord^.rgn := CreatePolygonRgn(PointArray, 4, WINDING);
  128.   RegionRecord^.id  := ' Hello from polygon region 2';
  129.   RegionList.Add(RegionRecord);
  130.   PointArray[1] := Point(200, 5);
  131.   PointArray[2] := Point(300, 10);
  132.   PointArray[3] := Point(280, 100);
  133.   PointArray[4] := Point(250, 160);
  134.   PointArray[5] := Point(200, 90);
  135.   New(RegionRecord);
  136.   RegionRecord^.rgn := CreatePolygonRgn(PointArray, 5, WINDING);
  137.   RegionRecord^.id  := ' Hello from polygon region 3';
  138.   RegionList.Add(RegionRecord);
  139.   ShowOrHide(Sender);
  140.   Label1.Caption := 'Polygon regions created.'
  141. end;
  142.  
  143. procedure TForm1.ButtonRectangleClick(Sender: TObject);
  144. var
  145.   x1,x2,y1,y2,
  146.   y0, i0:              Integer;
  147. begin
  148.   FreeRegions;
  149.   ImageHandle := Image1.Canvas.Handle;
  150.   for i0 := 0 to 5  do
  151.   begin
  152.     y0 := i0*40;
  153.     for i := 1 To 50 do
  154.     begin
  155.       x1 := i*7;
  156.       x2 := x1 + 6;
  157.       y1 := 1 + y0;
  158.       y2 := y1 + 30;
  159.       New(RegionRecord);
  160.       RegionRecord^.rgn := CreateRectRgn(x1,y1, x2,y2);
  161.       RegionRecord^.id  := ' Hello from rectangle region ' + IntToStr(i0*100+i);
  162.       RegionList.Add(RegionRecord);
  163.     end;
  164.   end;
  165.   ShowOrHide(Sender);
  166.   Label1.Caption := 'Rectangle regions created.'
  167. end;
  168.  
  169.  
  170. { The next procedure will iterate through the regions checking
  171.   to see if MouseDown event occured inside a region.  If so, the
  172.   caption of Label1 is changed to show the id of the region. }
  173.  
  174. procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  175.   Shift: TShiftState; X, Y: Integer);
  176. var i:   Integer;
  177. begin
  178.   Label1.Caption := '';
  179.   for i := 0 to RegionList.Count - 1 do
  180.   begin
  181.     RegionRecord := RegionList.Items[i];
  182.     if ptInRegion(RegionRecord^.Rgn, x, y) then
  183.       Label1.Caption := RegionRecord^.id;
  184.   end;
  185. end;
  186.  
  187.  
  188. { When the Show button is selected, this procedure prepares
  189.   a bitmap and draws outlies on it that correspond to the
  190.   regions that have been created.  }
  191.  
  192. procedure TForm1.ShowOrHide(Sender: TObject);
  193. begin
  194.   Bitmap                 := Tbitmap.Create;
  195.   Bitmap.Width           := Image1.Width;
  196.   BitMap.Height          := Image1.Height;
  197.   Image1.Picture.Graphic := Bitmap;
  198.   if RadioButtonShow.Checked then
  199.   begin
  200.     ImageHandle            := Image1.Canvas.Handle;
  201.     for i := 0 to RegionList.Count - 1 do
  202.     begin
  203.       RegionRecord := RegionList.Items[i];
  204.       FrameRgn(ImageHandle, RegionRecord^.Rgn, RedBrush, 1, 1);
  205.     end;
  206.     Image1.Invalidate;
  207.     Label1.Caption := '';
  208.   end;
  209.   Bitmap.Free;
  210. end;
  211.  
  212. end.
  213.